#ifndef __FSL_SINGLE_KEY_H__
#define __FSL_SINGLE_KEY_H__

#ifdef __cplusplus
extern "C" {
#endif

#include <stdint.h>
#include "list.h"

#define FSL_SINGLE_KEY_LOOP_GAP_TICK    0
#define FSL_SINGLE_KEY_LOOP_SYS_TICK    1
#define FSL_SINGLE_KEY_LOOP_CALL_MODE   FSL_SINGLE_KEY_LOOP_GAP_TICK

#define FSL_SINGLE_KEY_INDICATE_OFF     0
#define FSL_SINGLE_KEY_INDICATE_BRIEF   1
#define FSL_SINGLE_KEY_INDICATE_MODE    FSL_SINGLE_KEY_INDICATE_BRIEF

typedef struct {
    uint8_t click_count;     // 点击次数（内部使用，初始化为0xFF）
    uint8_t press_time;      // 按下时间（内部使用，初始化为0）
    uint8_t release_time;    // 释放时间（内部使用，初始化为0）
    uint8_t pin_last_state;            // 上次引脚状态（内部使用，初始化为KEY_RELEASE）
    uint8_t pin_curr_state_debounce;   // 当前引脚去痘后的状态（内部使用，初始化为KEY_RELEASE）
    uint8_t key_value;                 // 检测到的按键状态（内部使用，初始化为KEY_NONE_VAL）
    uint8_t key_value_out;             // 按键状态对外输出变量
    uint8_t (*hw_pin_is_press)(void);  // 查询当前硬件引脚是否按下接口
    list_obj_t list;         // 侵入式双向链表
} key_dev_t;

#define KEY_NONE_VAL            0x00
#define KEY_CLICK_VAL           0x01
#define KEY_D_CLICK_VAL         0x02
#define KEY_LONG_PRESS_VAL      0x04
#define KEY_LONG_RELEASE_VAL    0x08

void fsl_single_key_init_dev(key_dev_t *dev);
void fsl_single_key_register_dev(key_dev_t *dev);

#if FSL_SINGLE_KEY_LOOP_CALL_MODE == FSL_SINGLE_KEY_LOOP_GAP_TICK
void fsl_single_key_loop(uint8_t loop_gap_ms);
#elif FSL_SINGLE_KEY_LOOP_CALL_MODE == FSL_SINGLE_KEY_LOOP_SYS_TICK
void fsl_single_key_loop(uint32_t system_tick_ms);
#endif

uint8_t fsl_single_key_is_valid(void);

#if FSL_SINGLE_KEY_INDICATE_MODE == FSL_SINGLE_KEY_INDICATE_BRIEF
void fsl_single_key_register_indicate_callback(void (*cb)(void));
#endif

#ifdef __cplusplus
}
#endif

#endif /* __FSL_SINGLE_KEY_H__ */
